/*
1.获取用户收货地址
  1.绑定事件
  2.调用小程序内置api 获取用户收货地址 wx.chooseAddress ==>不可行
2.获取用户收货地址的 权限状态 scope
  1.假如按确定===》authSetting 为true scope.address
  2.假设用户没有使用过 收货地址api  scope  =>undefine
    
  3.假如取消   ===》 authSetting 为false
    1.诱导用户 自己打开授权页面(wx.openSetting) 当用户当用户给与 获取收货地址权限的时候
    2.获取收货地址
  4.获取到本地存储中
3.页面加载完成
  1.获取本地的存储中的地址数据
  2.把数据 设置给data中的一个变量
4.onShow
.   0.回到商品的详情页面
      1.在第一次添加商品中
        1.num =1
        2.checked =true
    1.获取缓存中的购物车数组
    2.把购物车数据填充到data中
5.全选数据的实现 渲染
  1.onShow 获取缓存数据
  2.根据购物车中的商品数据，所有的商品都被选中 checked=true 全选就被选中
6.总价格和总数量
  1. 需要商品被选中，才被计算
  2.获取购物车的数组
  3.遍历
  4.判断商品是否被选中
  5.总价格 +=  商品价格 * 商品数量；
  5.总数量 += 商品数量
  6.把计算后的价格和数量 设置回data中即可
7.商品被选中
  1.绑定change事件
  2.获取到被修改的商品价格
  3.商品对象的选中状态取反
  4.重新填充到data缓存中
  5.重新计算全选，总价格...
8.全选和反选
  1.全选复选框绑定change事件
  2.获取data中的全选变量 allChecked
  3.直接取反 allChecked = ！allChecked
  4.遍历购物车数组 让里面 商品 选中状态 随着 allChecked 变化而变化
  5.把购物车数组 和 allChecked 重新设置回data中 把购物车数组重新设置回缓存中
9.商品的数量编辑
  1.“+” “-” 绑定同一个点击事件 区分 使用不同 data属性
    1. “+” “+1”
    2. “-” “-1”
  2.传递被点击的商品的id goods_id；
  3.获取data中购物车数组，来获取需要被修改的值
  4.当商品的数量是 1 的时候，用户点击 “-” 弹框提示(wx.showModal)用户是否要删除
    1. 确定 =》删除
    2. 取消 =》什么都不要做
  4.直接修改商品的数量 num的值
  5.把cart重新设置回 缓存中 和data中 this.setCart();
10.点击结算页面
  1.判断是否有选择商品
  2.判断是否有收获地址
  3.以上通过验证，则跳转到支付页面
 */
// 引入文件
import { getSetting, chooseAddress, openSetting, showModal, showToast} from "../../utils/asyncWx.js";
import regeneratorRuntime from "../../lib/runtime/runtime.js";
Page({
  data:{
    address:{},
    cart:[],
    allChecked:false,
    totalPrice:0,
    totalNum:0
  },
  onShow(){
    // 1.获取缓存中的收货地址信息
    const address = wx.getStorageSync("address");
    // 获取缓存中的数组
    const cart = wx.getStorageSync("cart")||[];
    
    // 设置data
    this.setData({
      address
    })
    // 调用
    this.setCart(cart);
  },
  async HandelChooesAddress(e){
    try{
      // 获取权限状态
      const res1 = await getSetting();
      const scopeAddress = res1.authSetting["scope.address"];
      // 判断状态
      // if (scopeAddress === true || scopeAddress === undefined) {
      //   // 调用获取收货地址 api
      //   const res2 = await chooseAddress();
      //   console.log(res2);
      // }
      // else{
      //   // 诱导用户打开授权页面
      //   await openSetting();
      //   // 调用获取地址的 api
      //   const res3 = await chooseAddress();
      //   console.log(res3);
      // }

      // 》===优化
      if (scopeAddress === false) {
        await openSetting();
      }
      // 调用获取收货地址 api
      let address = await chooseAddress();
      // 存入到缓存中
      wx.setStorageSync("address", address);
    }
    catch(err){
      console.log(err);
    }
  },
  // 商品的选中
  handelItemChange(e){
    // 获取被修改的id
    const goods_id = e.currentTarget.dataset.id;
    // console.log(goods_id);
    //获取购物车数组
    let {cart} = this.data;
    // 找到被修改的对象
    // console.log(cart);
    let index = cart.findIndex(v => v.data.message.goods_id === goods_id);
    // 选中状态取反
    // console.log(index);
    cart[index].checked =! cart[index].checked;

    // 调用
    this.setCart(cart);

    // 把购物车数组重修设置回data中和缓存中
    this.setData({
      cart
    });
  },
  //封装购物车函数
  setCart(cart){
   

    // 重新计算价格和数量
    let allChecked = true;
    // 总价格，总数量
    let totalPrice = 0;
    let totalNum = 0;

    cart.forEach(v => {
      if (v.checked) {
        totalPrice += v.data.message.goods_price * v.num;
        totalNum += v.num;
      } else {
        allChecked = false;
      }
    })
    //  判断
    allChecked = cart.length != 0 ? allChecked : false;

    this.setData({
      cart,
      totalPrice,
      totalNum,
      allChecked
    }); 
    wx.setStorageSync("cart", cart);
  },
  // 商品的全选状态
  handelItemAllCheck(){
    // 1.获取data中的数据
    let {cart,allChecked} = this.data;
    // 2.修改值
    allChecked = ! allChecked;
    // 3.循环修改 cart数组中的商品选中状态
    cart.forEach(v=>v.checked=allChecked);
    // 4.把修改后的值 填充回 data 获取缓存中
    this.setCart(cart);
  },
  // 数量的加减
 async handelItemNumEdit(e){
    // 1.获取传递过来的参数
    const {operation,id} = e.currentTarget.dataset;
    // console.log(operation, id);
    // 2.获取购物车数组
    let {cart} = this.data;
    // 3.找到需要修改的商品id
    const index = cart.findIndex(v=>v.data.message.goods_id === id);
    // 4.删除的判断
    if(cart[index].num===1 && operation===-1){
      const res = await showModal({ content: "你是否要删除？" });
      if (res.confirm) {
        // console.log("确定");
        cart.splice(index, 1);
        this.setCart(cart);
      } 
    }
    else{
      // 4.修改数量
      cart[index].num += operation;
      // 5.设置回data 和缓存中
      this.setCart(cart);
    }
  },
  //点击支付页面 showToast
  async HandelPay(){
    // 1.判断收获地址
    const {address,totalNum} = this.data;
    if(!address.userName){
      await showToast({title:"您还没选择收货地址"});
      return;
    }
    //2.判断用户是否有购买商品
    if (totalNum===0){
      await showToast({ title: "您还没选择商品哦" });
      return;
    }
    // 3.跳转支付页面
    wx.navigateTo({
      url: '/pages/pay/index'
    });
  }
})